/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica.Controladoras.Personal;

import Logica.Core.PersonaLegal.ART;
import Logica.Core.PersonaLegal.Personal;
import Logica.Core.PersonaLegal.Proveedor;
import Logica.Core.Personal.Equipamiento;
import Logica.Core.Personal.Insumo;
import Logica.Core.Personal.PlantillaHorarios;
import Logica.Core.Personal.PuestoTrabajo;
import Persistencia.ControladoraPersistencia;
import Persistencia.JPAControllers.exceptions.NonexistentEntityException;
import Persistencia.JPAControllers.exceptions.PreexistingEntityException;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Daniel
 */
public final class ControladoraLogicaPersonal {

    protected ControladoraPersistencia miControladora;
    private List<Equipamiento> misEquipamientos = new LinkedList<>();
    private List<Insumo> misInsumos = new LinkedList<>();
    private List<PlantillaHorarios> misPlantillaHorarios = new LinkedList<>();
    private List<PuestoTrabajo> misPuestoTrabajo = new LinkedList<>();

    public ControladoraLogicaPersonal(ControladoraPersistencia miControladora) {
        this.miControladora = miControladora;


        misEquipamientos = dameMisEquipamientos();
        misInsumos = dameMisInsumos();
        misPlantillaHorarios = dameMisPlantillaHorarios();
        misPuestoTrabajo = dameMisPuestoTrabajo();
    }

    // <editor-fold defaultstate="collapsed" desc="Clase Equipamientos">
    public void crearEquipamiento(String nombre, boolean obligatorio, ART miART) throws PreexistingEntityException, Exception {

        misEquipamientos = dameMisEquipamientos();
        int nroEquipamiento = misEquipamientos.size();
        boolean encontro = false;
        Equipamiento miNuevoEquipamiento = new Equipamiento(nroEquipamiento, nombre, obligatorio, miART);


        for (int i = 0; i < misEquipamientos.size() && !encontro; i++) {
            Equipamiento miEquipamiento = misEquipamientos.get(i);
            if (miEquipamiento.getNro() == nroEquipamiento) {
                encontro = true;
                throw new PreexistingEntityException("Equipamiento ya Existente.");
            }
        }

        misEquipamientos.add(miNuevoEquipamiento);
        miControladora.getMiPersistenciaEquipamiento().crearEquipamiento(miNuevoEquipamiento);
    }

    public void eliminarEquipamiento(int nro) throws NonexistentEntityException, Exception {
        misEquipamientos = dameMisEquipamientos();
        boolean encontro = false;
        Equipamiento miEquipamiento = null;

        for (int i = 0; i < misEquipamientos.size() && !encontro; i++) {
            miEquipamiento = misEquipamientos.get(i);
            if (miEquipamiento.getNro() == nro) {
                encontro = true;
                misEquipamientos.remove(i);
            }
        }

        miControladora.getMiPersistenciaEquipamiento().eliminarEquipamiento(nro);
    }

    public void modificarEquipamiento(int nro, String nombre, boolean obligatorio, ART miART) throws NonexistentEntityException, Exception {
        misEquipamientos = dameMisEquipamientos();
        int pos = 0;
        boolean encuenetraEquipamiento = false;
        Equipamiento miEquipamiento = null;

        for (int i = 0; i < misEquipamientos.size() && !encuenetraEquipamiento; i++) {
            miEquipamiento = misEquipamientos.get(i);
            if (miEquipamiento.getNro() == nro) {
                pos = i;
                encuenetraEquipamiento = true;
            }
        }

        miEquipamiento.setNombre(nombre);
        miEquipamiento.setObligatorio(obligatorio);
        miEquipamiento.setMiART(miART);

        misEquipamientos.set(pos, miEquipamiento);
        miControladora.getMiPersistenciaEquipamiento().modificarEquipamiento(miEquipamiento);
    }

    public Equipamiento dameUnEquipamiento(int nro) {
        misEquipamientos = dameMisEquipamientos();
        boolean encontro = false;
        Equipamiento miEquipamiento = null;

        for (int i = 0; i < misEquipamientos.size() && !encontro; i++) {
            miEquipamiento = misEquipamientos.get(i);
            if (miEquipamiento.getNro() == nro) {
                encontro = true;
            }
        }

        return miEquipamiento;
    }

    public List<Equipamiento> dameMisEquipamientos() {
        misEquipamientos = miControladora.getMiPersistenciaEquipamiento().dameMisEquipamiento();
        return misEquipamientos;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Clase Insumos">
    public void crearInsumo(Proveedor miProveedor) throws PreexistingEntityException, Exception {

        misInsumos = dameMisInsumos();
        int nroInsumo = misInsumos.size();
        boolean encontro = false;
        Insumo miNuevoInsumo = new Insumo(nroInsumo, miProveedor);


        for (int i = 0; i < misInsumos.size() && !encontro; i++) {
            Insumo miInsumo = misInsumos.get(i);
            if (miInsumo.getId() == nroInsumo) {
                encontro = true;
                throw new PreexistingEntityException("Insumo ya Existente.");
            }
        }

        misInsumos.add(miNuevoInsumo);
        miControladora.getMiPersistenciaInsumo().crearInsumo(miNuevoInsumo);
    }

    public void eliminarInsumo(int nro) throws NonexistentEntityException, Exception {
        misInsumos = dameMisInsumos();
        boolean encontro = false;
        Insumo miInsumo = null;

        for (int i = 0; i < misInsumos.size() && !encontro; i++) {
            miInsumo = misInsumos.get(i);
            if (miInsumo.getId() == nro) {
                encontro = true;
                misInsumos.remove(i);
            }
        }

        miControladora.getMiPersistenciaInsumo().eliminarInsumo(nro);
    }

    public void modificarInsumo(int nro, Proveedor miProveedor) throws NonexistentEntityException, Exception {
        misInsumos = dameMisInsumos();
        int pos = 0;
        boolean encuenetraInsumo = false;
        Insumo miInsumo = null;

        for (int i = 0; i < misInsumos.size() && !encuenetraInsumo; i++) {
            miInsumo = misInsumos.get(i);
            if (miInsumo.getId() == nro) {
                pos = i;
                encuenetraInsumo = true;
            }
        }

        miInsumo.setMiProveedor(miProveedor);


        misInsumos.set(pos, miInsumo);
        miControladora.getMiPersistenciaInsumo().modificarInsumo(miInsumo);
    }

    public Insumo dameUnInsumo(int nro) {
        misInsumos = dameMisInsumos();
        boolean encontro = false;
        Insumo miInsumo = null;

        for (int i = 0; i < misInsumos.size() && !encontro; i++) {
            miInsumo = misInsumos.get(i);
            if (miInsumo.getId() == nro) {
                encontro = true;
            }
        }

        return miInsumo;
    }

    public List<Insumo> dameMisInsumos() {
        misInsumos = miControladora.getMiPersistenciaInsumo().dameMisInsumo();
        return misInsumos;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Clase PlantillaHorarios">
    public void crearPlantillaHorarios(Personal miPersonal, PuestoTrabajo miPuestoTrabajo, Date fechaHoraEntrada, Date fechaHoraSalida) throws PreexistingEntityException, Exception {

        misPlantillaHorarios = dameMisPlantillaHorarios();
        int nroPlantillaHorarios = misPlantillaHorarios.size();
        boolean encontro = false;
        PlantillaHorarios miNuevoPlantillaHorarios = new PlantillaHorarios(nroPlantillaHorarios, miPersonal,miPuestoTrabajo,fechaHoraEntrada, fechaHoraSalida);


        for (int i = 0; i < misPlantillaHorarios.size() && !encontro; i++) {
            PlantillaHorarios miPlantillaHorarios = misPlantillaHorarios.get(i);
            if (miPlantillaHorarios.getId() == nroPlantillaHorarios) {
                encontro = true;
                throw new PreexistingEntityException("PlantillaHorarios ya Existente.");
            }
        }

        misPlantillaHorarios.add(miNuevoPlantillaHorarios);
        miControladora.getMiPersistenciaPlantillaHorarios().crearPlantillaHorarios(miNuevoPlantillaHorarios);
    }

    public void eliminarPlantillaHorarios(int nro) throws NonexistentEntityException, Exception {
        misPlantillaHorarios = dameMisPlantillaHorarios();
        boolean encontro = false;
        PlantillaHorarios miPlantillaHorarios = null;

        for (int i = 0; i < misPlantillaHorarios.size() && !encontro; i++) {
            miPlantillaHorarios = misPlantillaHorarios.get(i);
            if (miPlantillaHorarios.getId() == nro) {
                encontro = true;
                misPlantillaHorarios.remove(i);
            }
        }

        miControladora.getMiPersistenciaPlantillaHorarios().eliminarPlantillaHorarios(nro);
    }

    public void modificarPlantillaHorarios(int nro,Personal miPersonal, PuestoTrabajo miPuestoTrabajo, Date fechaHoraEntrada, Date fechaHoraSalida) throws NonexistentEntityException, Exception {
        misPlantillaHorarios = dameMisPlantillaHorarios();
        int pos = 0;
        boolean encuenetraPlantillaHorarios = false;
        PlantillaHorarios miPlantillaHorarios = null;

        for (int i = 0; i < misPlantillaHorarios.size() && !encuenetraPlantillaHorarios; i++) {
            miPlantillaHorarios = misPlantillaHorarios.get(i);
            if (miPlantillaHorarios.getId() == nro) {
                pos = i;
                encuenetraPlantillaHorarios = true;
            }
        }
        miPlantillaHorarios.setMiPersonal(miPersonal);
        miPlantillaHorarios.setMiPuestoTrabajo(miPuestoTrabajo);
        miPlantillaHorarios.setFechaHoraEntrada(fechaHoraEntrada);
        miPlantillaHorarios.setFechaHoraSalida(fechaHoraSalida);

        misPlantillaHorarios.set(pos, miPlantillaHorarios);

        miControladora.getMiPersistenciaPlantillaHorarios().modificarPlantillaHorarios(miPlantillaHorarios);
    }

    public PlantillaHorarios dameUnPlantillaHorarios(int nro) {
        misPlantillaHorarios = dameMisPlantillaHorarios();
        boolean encontro = false;
        PlantillaHorarios miPlantillaHorarios = null;

        for (int i = 0; i < misPlantillaHorarios.size() && !encontro; i++) {
            miPlantillaHorarios = misPlantillaHorarios.get(i);
            if (miPlantillaHorarios.getId() == nro) {
                encontro = true;
            }
        }

        return miPlantillaHorarios;
    }

    public List<PlantillaHorarios> dameMisPlantillaHorarios() {
        misPlantillaHorarios = miControladora.getMiPersistenciaPlantillaHorarios().dameMisPlantillasHorarios();
        return misPlantillaHorarios;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Clase PuestoTrabajos">
    public void crearPuestoTrabajo(String rol, List<Personal> miPersonal) throws PreexistingEntityException, Exception {

        misPuestoTrabajo = dameMisPuestoTrabajo();
        boolean encontro = false;
        PuestoTrabajo miNuevoPuestoTrabajo = new PuestoTrabajo(rol,miPersonal);


        for (int i = 0; i < misPuestoTrabajo.size() && !encontro; i++) {
            PuestoTrabajo miPuestoTrabajo = misPuestoTrabajo.get(i);
            if (miPuestoTrabajo.getRol().equals(rol)) {
                encontro = true;
                throw new PreexistingEntityException("PuestoTrabajo ya Existente.");
            }
        }

        misPuestoTrabajo.add(miNuevoPuestoTrabajo);
        miControladora.getMiPersistenciaPuestoTrabajo().crearPuestoTrabajo(miNuevoPuestoTrabajo);
    }

    public void eliminarPuestoTrabajo(String rol) throws NonexistentEntityException, Exception {
        misPuestoTrabajo = dameMisPuestoTrabajo();
        boolean encontro = false;
        PuestoTrabajo miPuestoTrabajo = null;

        for (int i = 0; i < misPuestoTrabajo.size() && !encontro; i++) {
            miPuestoTrabajo = misPuestoTrabajo.get(i);
            if (miPuestoTrabajo.getRol().equals(rol)) {
                encontro = true;
                misPuestoTrabajo.remove(i);
            }
        }

        miControladora.getMiPersistenciaPuestoTrabajo().eliminarPuestoTrabajo(rol);
    }

    public void modificarPuestoTrabajo(String rol, List<Personal> miPersonal) throws NonexistentEntityException, Exception {
        misPuestoTrabajo = dameMisPuestoTrabajo();
        int pos = 0;
        boolean encuenetraPuestoTrabajo = false;
        PuestoTrabajo miPuestoTrabajo = null;

        for (int i = 0; i < misPuestoTrabajo.size() && !encuenetraPuestoTrabajo; i++) {
            miPuestoTrabajo = misPuestoTrabajo.get(i);
            if (miPuestoTrabajo.getRol().equals(rol)) {
                pos = i;
                encuenetraPuestoTrabajo = true;
            }
        }

        miPuestoTrabajo.setMiPersonal(miPersonal);

        misPuestoTrabajo.set(pos, miPuestoTrabajo);
        miControladora.getMiPersistenciaPuestoTrabajo().modificarPuestoTrabajo(miPuestoTrabajo);
    }

    public PuestoTrabajo dameUnPuestoTrabajo(String rol) {
        misPuestoTrabajo = dameMisPuestoTrabajo();
        boolean encontro = false;
        PuestoTrabajo miPuestoTrabajo = null;

        for (int i = 0; i < misPuestoTrabajo.size() && !encontro; i++) {
            miPuestoTrabajo = misPuestoTrabajo.get(i);
            if (miPuestoTrabajo.getRol().equals(rol)) {
                encontro = true;
            }
        }

        return miPuestoTrabajo;
    }

    public List<PuestoTrabajo> dameMisPuestoTrabajo() {
        misPuestoTrabajo = miControladora.getMiPersistenciaPuestoTrabajo().dameMisPuestoTrabajo();
        return misPuestoTrabajo;
    }
    // </editor-fold>
}
